package cn.tedu.luban.account.webapi.repository;

import cn.tedu.luban.account.webapi.pojo.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

// Repository是Spring家族对持久层的命名规范
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {

    // ItemRepository接口继承ElasticsearchRepository父接口,这个父接口由SpringData提供
    // ElasticsearchRepository泛型<[要操作的实体类],[这个实体类的主键类型]>
    // 继承之后,当前接口就可以直接使用父接口中声明的方法,包含了Item实体类基本的增删改查


    // SpringData自定义查询
    // 我们可以编写一个符合SpringData框架要求格式的方法名
    // SpringData会根据我们定义的方法名称推测出我们的意图,自动生成能够完成这个操作的查询语句
    // query(查询):表示当前方法是一个进行查询操作的方法,类似数据库中的select
    // Item/Items:表单要查询的实体,如果可能返回集合应该在类型后加s
    // By(通过/根据):表单查询条件开始的关键字,类似sql中的where
    // Title:是要查询的字段,只能是Item类中存在的字段
    // Matches(匹配):如果不写,会自动添加,意思是匹配参数中给的内容,类似sql中的like

    List<Item> queryItemsByTitleMatches(String title);



    // 多条件自定义查询
    // 多个条件之间要使用And或Or进行分隔,表示多个条件间的逻辑关系
    // 我们要使用title和brand字段进行多条件查询
    // 参数的数量和需要的数量要匹配
    // 参数赋值到需要参数的位置是根据顺序依次赋值的,和参数名称无关
    List<Item> queryItemsByTitleMatchesAndBrandMatches(String title, String brand);


    // 排序查询
    // 在方法最后添加OrderBy关键字,然后指定排序依据的字段,最后设置升序(Asc\默认)降序(Desc)
    List<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand);


    // 分页查询
    // 要执行分页查询,首先要将返回值修改为Page类型
    // Page类型的功能是既能保存查询出的当前页数据,又能保存分页信息
    // 分页信息就是本次查询结果中分页相关的数据,例如:当前页码,每页条数,总页数,总条数,有没有上一页...等
    // 参数方面,在当前所有已经存在的参数最后,再添加一个Pageable类型的参数
    // 在调用时,为这个pageable参数赋值要查询的页码和每页的条数
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);



}
